package com.tjian.fafa.user.module.home.baiduMap;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

import com.tjian.fafa.user.R;

import android.app.Activity;
import android.os.Bundle;

public class BaiduMapZoomIconChangeActivity extends Activity{
	private LocationClient locationClient;//定位客户端
	private MyLocationListener locationListener=new MyLocationListener();
	private MapView mvMap;//百度地图控件
	private BaiduMap baiduMap;//地图对象控制器
	private ZoomControlsView zcvZomm;//缩放控件
	private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//必须在setContentView前
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.main_activity_baidumap_zoom);
		initMap();//初始化
	}
	
	/**
	 * 初始化地图
	 */
	private void initMap(){
		//获取地图控件
		mvMap=(MapView) findViewById(R.id.mv_map);
		mvMap.showZoomControls(false);//隐藏缩放控件
		//获取地图对象控制器
		baiduMap=mvMap.getMap();
		baiduMap.setBuildingsEnabled(true);//设置显示楼体
		baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));//设置地图状态
		
		//获取缩放控件
		zcvZomm=(ZoomControlsView) findViewById(R.id.zcv_zoom);
		zcvZomm.setMapView(mvMap);//设置百度地图控件
		
		//创建定位客户端
		locationClient=new LocationClient(getApplicationContext());
		//注册监听器
		locationClient.registerLocationListener(locationListener);
		
		
		//实例化客户端定位参数
		LocationClientOption options=new LocationClientOption();
		options.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
		options.setCoorType("gcj02");//返回定位结果
		options.setScanSpan(6000);//设置定位扫描间隔时间
		options.setIsNeedAddress(true);//设置定位结果中是否含地址信息，默认无
		options.setNeedDeviceDirect(true);//设置网络定位时，需要设备方向
		locationClient.setLocOption(options);//设置定位参数
		locationClient.start();//开始定位
		
	}
	
	/**
	 * 实现百度定位监听器
	 * @author Arvin_Li
	 *
	 */
	public class MyLocationListener implements BDLocationListener{
		@Override
		public void onReceiveLocation(BDLocation location) {
			if (location == null) return ;
			//创建地理坐标点对象
			LatLng point=new LatLng(location.getLatitude(), location.getLongitude());
			//将国测局坐标转为百度坐标
			point=gcjTobaidu(point);
			//开启定位图层
			baiduMap.setMyLocationEnabled(true);
			//构造定位数据
			MyLocationData locData=new MyLocationData.Builder()
			.accuracy(location.getRadius())//设置位置的精度信息
			.direction(location.getDirection())//设置获取到的方向信息，顺时针0-360
			.latitude(point.latitude)//设置定位数据的纬度
			.longitude(point.longitude)//设置定位数据的经度
			.build();//构建生成定位数据对象
			//设置定位数据
			baiduMap.setMyLocationData(locData);
			//构建定位图标
			constructionLocationIcon(point);
		}
	}
	
	/**
	 * 构建定位图标
	 * @param point 图标位置
	 */
	private void constructionLocationIcon(LatLng point){
		//创建Marker图标
		BitmapDescriptor descriptor=BitmapDescriptorFactory.fromResource(R.drawable.xk);
		//构建MarkerOption，用于在地图上添加Marker
		OverlayOptions options=new MarkerOptions()
		.icon(descriptor)//设置图标
		.position(point)//设置图标位置
		.draggable(true)//允许拖拽
		.zIndex(5);//设置图标层次
		//清空地图所有的 Overlay 覆盖物以及 InfoWindow
		baiduMap.clear();
		//在地图上添加图标
		baiduMap.addOverlay(options);
		//设置定位图层配置信息，只有先允许定位图层后设置定位图层配置信息才会生效
		baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, descriptor));
		//关闭定位图层
		baiduMap.setMyLocationEnabled(false);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		mvMap.onPause();
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		mvMap.onResume();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(null!=locationClient&&locationClient.isStarted()){
			locationClient.stop();//停止定位
		}
		locationClient=null;
		mvMap.onDestroy();//销毁地图
	}
	
	/**
	 * 国测局转换百度经纬度
	 * @param point
	 * @return
	 */
	public static LatLng gcjTobaidu(LatLng point) {
		// double x = gg_lon, y = gg_lat;
		double x = point.longitude, y = point.latitude;
		double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
		double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
		double bd_lon = z * Math.cos(theta) + 0.0065;
		double bd_lat = z * Math.sin(theta) + 0.006;
		LatLng point1 = new LatLng(bd_lat,bd_lon);
		return point1;
	}
}
